#include <iostream>

#if 0
    // 定义这样一个类用来描述整型数据
    class Integer
    {
    public:
        Integer(int a):a(a){std::cout<<"构造函数！\n";} 
        ~Integer(){std::cout<<"析构函数！\n";}   
        void show(){std::cout<<a<<std::endl;}

    private:
        int a;  // 私有的，不能在外部对a进行修改
    };

    int main()
    {
        // 构造函数的隐式转换
        // 构造函数会把符合它构造函数形式的参数隐式转换成匿名对象
        // 第一个构造 
        Integer i(10);
        // 第二个构造，接着就析构   
        i = 20; // 将20隐式转换成匿名对象，然后再把匿名对象通过赋值运算符重载给到i，通过这种方式改变了i的值，很危险
        // 等价于 
        // i = Integer(20); // 匿名对象（这句话最终调赋值运算符重载）
        i.show();

        return 0;
    }
#endif

#if 1
// explicit关键字：由它定义的构造函数禁止隐式转换
class Integer
{
public:
    explicit Integer(int a) : a(a) { std::cout << "构造函数！\n"; }
    ~Integer() { std::cout << "析构函数！\n"; }
    void show() { std::cout << a << std::endl; }

private:
    int a;
};

int main()
{
    Integer i(10);
    // i = 20; // 没有与这些操作数匹配的 "=" 运算符（相当于不能直接把一个int类型赋值给Integer类型），现在就不允许隐式转换了
    i = Integer(20); // 相当于把这个对象给它定义赋值，这个是可以操作的
    i.show();

    return 0;
}
#endif
